#pragma once
#include <string>
#include <vector>
#include <set>

#include "cppjieba/Jieba.hpp"
#include "simhash/Simhasher.hpp"
#include "tinyxml2.h"

#define SIMHASH_TOPN 50

class PageProcessor
{
public:
    PageProcessor();
    void process(const std::string &dir);

    void show_document(const std::string &filename);
    void showProgressBar(const std::string &toolname,size_t current, size_t total, int width);

    private:
    // 提取xml文件
    void extract_documents(const std::string &dir);

    // 对m_documents进行去重
    void deduplicate_documents();

    // 生成页面数据文件pages和偏移量文件offsets
    void build_pages_and_offsets(const std::string &pages, const std::string &offsets);

    // 构建倒排索引
    void build_inverted_index(const std::string &filename);

private:
    struct Document
    {
        int id;              // 文档id
        std::string link;    // 文档链接
        std::string title;   // 文档标题
        std::string content; // 文档内容
    };

private:
    cppjieba::Jieba m_tokenizer;
    simhash::Simhasher m_hasher;       // 用于计算文档的simhash值，实现去重
    std::set<std::string> m_stopWords; // 停用词集合
    std::vector<Document> m_documents; // 存储所有文档
    // 倒排索引：键是词语，值是map，映射id和权重（TF-IDF)
    std::map<std::string, std::map<int, double>> m_invertedIndex;
};